/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.brain.inve.manager;

import com.brain.comp.dto.PedidoCompraDetaDto;
import com.brain.conf.dto.AlmacenDto;
import com.brain.conf.dto.AlmacenUbicacionDto;
import com.brain.conf.manager.AlmacenManager;
import com.brain.core.common.ExportarExcelInve;
import com.brain.core.common.UtilCore;
import com.brain.core.configuracion.WebServletContextListener;
import com.brain.core.manager.*;
import com.brain.core.exception.DAOException;
import com.brain.core.hibernate.dao.DAOGenerico;
import com.brain.inve.dto.GuiaRemisionDetaDto;
import com.brain.inve.dto.IntercambioUbicaDetaDto;
import com.brain.inve.dto.StockDto;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.annotation.Resource;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Service;

/**
 *
 * @author Indra
 */
@Service
public class StockManager extends ComunManager<StockDto> implements Serializable {

    private static Logger logger = Logger.getLogger(StockManager.class);
    private Long idEntidad = 164L;
    @Resource
    private DAOGenerico<StockDto> springHibernateDao;
    @Resource
    private RecursosManager recursosManager;
    private final String urlLista = "/pages/inve/stock/consultaStocks.xhtml";

    public List<StockDto> obtenerStockPorAlmUbiYProducto(GuiaRemisionDetaDto detaDto, AlmacenUbicacionDto auDto) throws DAOException {
        String hqsql = "select e from StockDto as e where e.id=e.id ";
        List<Object> listaParametros = new ArrayList<Object>();
        hqsql += " and e.stockDtoPK.productoDetaDto.id = ?";
        listaParametros.add(detaDto.getProductoDetaDto().getId());
        hqsql += " and e.stockDtoPK.almacenUbicacionDto.id = ?";
        listaParametros.add(auDto.getId());
        System.out.println(hqsql);
        return springHibernateDao.ejecutarQuery(hqsql, listaParametros);
    }
    
    public List<StockDto> obtenerStockPorAlmUbiYProducto(IntercambioUbicaDetaDto detaDto, AlmacenUbicacionDto auDto) throws DAOException {
        String hqsql = "select e from StockDto as e where e.id=e.id ";
        List<Object> listaParametros = new ArrayList<Object>();
        hqsql += " and e.stockDtoPK.productoDetaDto.id = ?";
        listaParametros.add(detaDto.getProductoDetaDto().getId());
        hqsql += " and e.stockDtoPK.almacenUbicacionDto.id = ?";
        listaParametros.add(auDto.getId());
        System.out.println(hqsql);
        return springHibernateDao.ejecutarQuery(hqsql, listaParametros);
    }

    public List<StockDto> obtener(StockDto dtoFiltro) throws DAOException {
        String hqsql = "select e from StockDto as e where e.id=e.id ";
        List<Object> listaParametros = new ArrayList<Object>();
        if(dtoFiltro.getAlmacenDto().getId()!=null ){
            hqsql += " and e.almacenDto.id = ?";
            listaParametros.add(dtoFiltro.getAlmacenDto().getId());
        }
        
        if(dtoFiltro.getAuDto().getId() != null){
            hqsql += " and e.stockDtoPK.almacenUbicacionDto.id = ?";
            listaParametros.add(dtoFiltro.getAuDto().getId());
        }
        
        if (dtoFiltro.getIdProducto() != null && !dtoFiltro.getIdProducto().equals(0L)) {
            hqsql += " and e.stockDtoPK.productoDetaDto.id = ?";
            listaParametros.add(dtoFiltro.getIdProducto());
        }
        
        if (dtoFiltro.getDescProducto() != null && dtoFiltro.getDescProducto().length() != 0) {
            hqsql += " and ( upper(e.stockDtoPK.productoDetaDto.sku) like '%" + dtoFiltro.getDescProducto().toUpperCase() + "%'";
            hqsql += " or upper( e.stockDtoPK.productoDetaDto.productoDto.descripcionCorta) like '%" + dtoFiltro.getDescProducto().toUpperCase() + "%'";
            hqsql += " or upper( e.stockDtoPK.productoDetaDto.productoDto.descripcionDetalle) like '%" + dtoFiltro.getDescProducto().toUpperCase() + "%'";
            hqsql += " or upper( e.stockDtoPK.productoDetaDto.productoDto.descripcionIdioma1) like '%" + dtoFiltro.getDescProducto().toUpperCase() + "%'";
            hqsql += " or upper( e.stockDtoPK.productoDetaDto.productoDto.descripcionIdioma2) like '%" + dtoFiltro.getDescProducto().toUpperCase() + "%')";
        }
        System.out.println(hqsql);
        return springHibernateDao.ejecutarQuery(hqsql, listaParametros);
    }

    public AlmacenDto obtenerAlmacenPorDefault() {
        AlmacenDto almDto = null;
        try {
            AlmacenManager almacenManager = (AlmacenManager) WebServletContextListener.getApplicationContext().getBean("almacenManager");
            List<AlmacenDto> listaAlmacenes = almacenManager.obtenerAlmacenesActivosPorOrganizacion();
            almDto = listaAlmacenes.get(0);
        } catch (DAOException ex) {
            recursosManager.showError(ex.getMessage());
            logger.error(ex.getMessage());

        }
        return almDto;
    }
    
    public void generarExcelSeleccionados(ExportarExcelInve.Stock exp, StockDto[] selectedSs) {
        StringBuilder strCabecera = this.obtenerCabeceraExcel(exp);
        List<StockDto> lst = Arrays.asList(selectedSs);
        List lstCuerpo = this.obtenerCuerpoExcel(exp, lst);
        String nombreArchivo = "STOCK_" + UtilCore.Fecha.obtenerFechaHoraActual().replace(':', '_') + ".xls";
        this.recursosManager.generarExcel(strCabecera.toString(), lstCuerpo, nombreArchivo);
        this.recursosManager.viewArchivo(nombreArchivo);
    }
    
    public void generarExcelPorTabla(ExportarExcelInve.Stock exp, List<StockDto> lstS) {
        StringBuilder strCabecera = this.obtenerCabeceraExcel(exp);
        List lstCuerpo = this.obtenerCuerpoExcel(exp, lstS);
        String nombreArchivo = "STOCK_" + UtilCore.Fecha.obtenerFechaHoraActual().replace(':', '_') + ".xls";
        this.recursosManager.generarExcel(strCabecera.toString(), lstCuerpo, nombreArchivo);
        this.recursosManager.viewArchivo(nombreArchivo);
    }
    
    private List obtenerCuerpoExcel(ExportarExcelInve.Stock exp, List<StockDto> lst){
        StringBuilder strCuerpo;
        List lstFilas = new ArrayList();
        for(StockDto x: lst){
            strCuerpo = new StringBuilder();
            if(exp.getEmpresa()){
                if(x.getStockDtoPK() != null){
                    strCuerpo.append(x.getStockDtoPK().getProductoDetaDto().getProductoDto().getEmpresaDto().getDescripcion()).append("|");
                }
                else{
                    strCuerpo.append("-").append("|");
                }
            }
            if(exp.getAlmacen()){
                if(x.getAlmacenDto() != null){
                    strCuerpo.append(x.getAlmacenDto().getNombre()).append("|");
                }
                else{
                    strCuerpo.append("-").append("|");
                }
            }
            if(exp.getAlmacenUbicacion()){
                if(x.getAuDto() != null){
                    strCuerpo.append(x.getAuDto().getNombre()).append("|");
                }
                else{
                    strCuerpo.append("-").append("|");
                }
            }
            if(exp.getIdProducto()){
                if(x.getIdProducto() != null){
                    strCuerpo.append(x.getIdProducto()).append("|");
                }
                else{
                    strCuerpo.append("-").append("|");
                }
            }
            if(exp.getDescripcionProducto()){
                if(x.getDescProducto() != null){
                    strCuerpo.append(x.getDescProducto()).append("|");
                }
                else{
                    strCuerpo.append("-").append("|");
                }
            }
            if(exp.getCantidad()){
                if(x.getCantidad() != null){
                    strCuerpo.append(x.getCantidad()).append("|");
                }
                else{
                    strCuerpo.append("-").append("|");
                }
            }
            
            lstFilas.add(strCuerpo.toString());
        }
        return lstFilas;
    }
    
    private StringBuilder obtenerCabeceraExcel(ExportarExcelInve.Stock exp){
        StringBuilder strCabecera = new StringBuilder();
        if(exp.getEmpresa()){
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("stock.empresa")).append("|");
        }
        if(exp.getAlmacen()){
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("stock.almacen")).append("|");
        }
        if(exp.getAlmacenUbicacion()){
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("stock.almacen.ubicacion")).append("|");
        }
        if(exp.getIdProducto()){
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("stock.producto.id")).append("|");
        }
        if(exp.getDescripcionProducto()){
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("stock.descripcion.producto")).append("|");
        }
        if(exp.getCantidad()){
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("stock.cantidad")).append("|");
        }        
        return strCabecera;
    }
    
    public ExportarExcelInve.Stock onChangeChekExcel(Boolean flag) {
        return new ExportarExcelInve.Stock(flag);
    }

    public void nuevoMuchos(List<PedidoCompraDetaDto> lista) throws DAOException {
        springHibernateDao.guardarColeccion(lista);
    }

    public void eliminarMuchos(List<PedidoCompraDetaDto> lista) throws DAOException {
        springHibernateDao.borrarColeccion(lista);
    }

    public static Logger getLogger() {
        return logger;
    }

    public static void setLogger(Logger logger) {
        StockManager.logger = logger;
    }

    public Long getIdEntidad() {
        return idEntidad;
    }

    public void setIdEntidad(Long idEntidad) {
        this.idEntidad = idEntidad;
    }

    public DAOGenerico<StockDto> getSpringHibernateDao() {
        return springHibernateDao;
    }

    public void setSpringHibernateDao(DAOGenerico<StockDto> springHibernateDao) {
        this.springHibernateDao = springHibernateDao;
    }

    public RecursosManager getRecursosManager() {
        return recursosManager;
    }

    public void setRecursosManager(RecursosManager recursosManager) {
        this.recursosManager = recursosManager;
    }

    public String getUrlLista() {
        return urlLista;
    }
}
